<?php
class SalidasController extends AppController {
    var $name = 'Salidas';
    var $appModule = 'Almacen';
    var $helpers = array('Html','Form','Ajax','Javascript','Paginator', 'Number', 
    					'Codigo','GetList','AdcReporter', 'TextDate');
    var $components = array('RequestHandler');
    var $uses =  array('Salida', 'Kardex');

    function index($q = null) {    	   
        $q = $this->getBusqueda($this->data['Salida']['busqueda']);
        $this->set('q', $q);

        $this->Salida->Behaviors->attach('Containable');
        $this->paginate['Salida'] = array(
            'order'=>array('Salida.numero_control'=>'desc'),
            'fields'=>array(
                'Salida.id',                
                'Salida.numero_control',                
        		'Salida.fecha_emision',
                'Salida.codigo_documento_ref_id',                
                'Salida.numero_documento_ref',        
        		'Salida.tipo_movimiento_id',
        		'Salida.observaciones',
                'Salida.activo'),
            'contain' => array(
                'TipoOperacion'=>array('fields'=>array('id', 'descripcion'))));
        
        if (!empty($busqueda)){
            $Salidas = $this->paginate('Salida', array(
                'Salida.activo ='=>true,
				'Salida.empresa_id'=>$this->empresaId(),                
                'or'=>array(
                    'Salida.numero_control  SIMILAR TO'=>"%$busqueda%",
                    'Salida.numero_documento  SIMILAR TO'=>"%$busqueda%"                    
                )
            ));
        } else {
           	$Salidas = $this->paginate('Salida', array(
                'Salida.activo ='=>true,
				'Salida.empresa_id'=>$this->empresaId() ));
        }        
        $this->set('Salidas', $Salidas);
        $this->set('limite', $this->limite); 
              
    }
/* vista del controlador */
    function view($id = null) {
        
    }
  
/* funcion para agregar */
    public function add($tienda_id = null) {
    	$tipo_movimiento = $this->Salida->TipoOperacion->find('list', array(
    					'conditions'=>array(
    						'TipoOperacion.entrega'=>false, 
    						'TipoOperacion.activo'=>true)));
    	    	
    	$this->set('tipo_movimiento',$tipo_movimiento);    	    	
        if (!empty($this->data)) {
            $this->data['Salida']['empresa_id']=$this->empresaId();
            $this->data['Salida']['ejercicio_id']=$this->ejercicioId($this->data['Salida']['fecha_emision']);
            $this->data['Salida']['periodo_id']=$this->periodoId($this->data['Salida']['fecha_emision']);            
            $this->data['Salida']['activo']=true;
            $this->data['Salida']['usuario_creacion_id']=$this->usuarioId();
            $this->data['Salida']['fecha_creacion']='now()';
			
            $this->Salida->begin();
            $this->Salida->create();
            if ($this->Salida->save($this->data['Salida'])) {
            	foreach($this->data['SalidaDetalle'] as $detalle){
            		if($detalle['eliminado'] != 0)	continue;
            		$detalle['salida_id'] = $this->Salida->id;
            		$this->Salida->SalidaDetalle->create();
            		if(!$this->Salida->SalidaDetalle->save($detalle)){            		
            			$this->Salida->rollback();
            			$this->Session->setFlash('El Salida no ha sido guardado. Pruebe de nuevo.');
            			return false;
            		} else {            			
            			if($this->data['Salida']['descarga']){
	            			if(!$this->Kardex->generarMovimiento(array(
		            				'almacen_id'		=>	$this->centroDistId(),
		            				'ejercicio_id'		=>	$this->ejercicioId($this->data['Salida']['fecha_emision']),
		            				'periodo_id'		=>	$this->periodoId($this->data['Salida']['fecha_emision']),
		            				'fecha'				=>	$this->data['Salida']['fecha_emision'],
		            				'producto_id'		=>	$detalle['producto_id'],
		            				'codigo_documento_id'=>	$this->data['Salida']['codigo_documento_ref_id'],
		            				'documento_id'		=>	$detalle['salida_id'],	
		            				'cantidad'			=>	$detalle['cantidad'],
		            				'operacion_id'		=>	$this->data['Salida']['tipo_movimiento_id'],
		            				'operacion_almacen_id'=>2,            			
		            				'detalle_id'		=>	$this->Salida->SalidaDetalle->id,
									'fecha_emision'		=>	$this->data['Salida']['fecha_emision'],
									'numero_documento'	=>	$this->data['Salida']['numero_control'],
									'observaciones'		=>	$this->data['Salida']['observaciones']))){
	            			
	            				$this->Session->setFlash('No se pudo mover los saldos del producto '.$detalle['producto_descripcion']);
	            				$this->Salida->rollback();
								return false;	
							}
            			}
            		}
            	}            	 	
            	$this->Salida->commit();
	            $this->Session->setFlash(__('El Salida ha sido almacenado.', true));
	            $this->redirect(array('action'=>'index'));
            } else {            	
            	$this->Salida->rollback();
            	$this->Session->setFlash('El Salida no ha sido guardado. Pruebe de nuevo.');
            }       
        } else {        	
        	$this->data['Salida']['numero_control'] = $this->Salida->getNumeroControl($tienda_id);        	
        	$this->data['Salida']['descarga'] = true;
        	if($tienda_id){
        		//$this->Salida->Cliente->Behaviors->attach('Containable');
        		$CodigoDocumento = $this->Salida->CodigoDocumentoRef->find('first', array('recursive'=>-1,'conditions'=>array('CodigoDocumentoRef.id'=>115)));
        		
        		$cliente = $this->Salida->Cliente->find('first', array(
        					'fields'=>array(
        							'Cliente.id',
        							'Cliente.codigo',
        							'Cliente.localidad',
        							'Tercero.razon_social'),
        					'conditions'=>array('Cliente.localidad'=>$this->_usuario['CentroDist']['descripcion_corta'], 'Cliente.activo'=>true),
        					));
        		$this->data['Formulario']['modo'] = 'pedido';	
        		$this->data['Salida']['centro_dist_id'] = $tienda_id;
        		$this->data['Salida']['descarga'] = false;	
        		$this->data['Salida']['tipo_movimiento_id'] = 6;
        		$this->data['Salida']['cliente_id'] = $cliente['Cliente']['id'];
        		$this->data['Cliente']['Tercero']['razon_social'] = $cliente['Tercero']['razon_social'];
        		$this->data['Cliente']['codigo'] = $cliente['Cliente']['codigo'];
        		$this->data['Salida']['codigo_documento_ref_id'] = 115;
        		$this->data['Salida']['numero_documento_ref'] = $this->data['Salida']['numero_control'];        		
        		$this->data['CodigoDocumentoRef'] = $CodigoDocumento['CodigoDocumentoRef'];
        		
        	} else{
        		$this->data['Formulario']['modo'] = 'salida';
        		$this->data['Salida']['centro_dist_id'] = $this->centroDistId();        			
        	}        	
        }
    }
    
/* funcion para editar */
    function edit($id = null) {
    	$tipo_movimiento = $this->Salida->TipoOperacion->find('list', array('conditions'=>array('TipoOperacion.entrega'=>false, 'TipoOperacion.activo'=>true)));
    	$this->set('tipo_movimiento',$tipo_movimiento);
    	
        if ((!$id || !is_numeric($id)) && empty($this->data)) {
            $this->Session->setFlash(__('No se establecieron los datos correctamente', true));
            $this->redirect(array('action'=>'index'));
        }
		if (empty($this->data)) {
			$this->Salida->Behaviors->attach('Containable');
			$this->Salida->SalidaDetalle->Producto->bindModel(array(
					'hasMany'=>array(
						'SaldoAlmacene'=>array(
							'className'=>'SaldoAlmacene',
							'foreingKey'=>'producto_id',
							'conditions'=>array(
								'almacen_id'=>$this->centroDistId(),								
							),
							'order'=>array('ejercicio_id'=>'desc', 'periodo_id'=>'desc'),
							'limit'=>1 ))));		            
            $this->data = $this->Salida->find('first', 
            				array(
            					'conditions'=>array(
            						'Salida.id'=>$id,
            						'Salida.activo'=>true),
            					'contain'=>array(
            						'SalidaDetalle'=>array(
            							'Unidad',
            							'Producto'=>array('SaldoAlmacene.saldo_fisico')),
            						'CodigoDocumentoRef'=>array('id', 'simbolo','descripcion'),
            						'Cliente'=>array('id', 'codigo')            				
            				)));
            
            if(empty($this->data)){
                    $this->Session->setFlash('No se encontró el Salida');
                    $this->redirect(array('action'=>'index'),null,true);
            }
            
            if($this->data['Salida']['es_pedido'] && !$this->data['Salida']['descarga']){
            	$this->data['Formulario']['modo'] = 'pedido';	
            } else {
            	$this->data['Formulario']['modo'] = 'salida';	
            }          
		} else {
			$this->data['Salida']['usuario_modificacion_id'] = $this->usuarioId();
			$this->data['Salida']['fecha_modificacion'] = 'now()';			
			$this->Salida->begin();
			$original = $this->Salida->find('first', array('conditions'=>array('Salida.id'=>$this->data['Salida']['id']), 'recursive'=>-1));
			$result = true;			
			if($this->Salida->save($this->data['Salida'])){
				foreach($this->data['SalidaDetalle'] as $detalle){
					if(empty($detalle['eliminado'])){
						if(empty($detalle['id'])){
							$this->Salida->SalidaDetalle->create();
						} else {
							if($original['Salida']['descarga']){
								$_detalle = $this->Salida->SalidaDetalle->find('first', array(
														'recursive'=>-1, 
														'conditions'=>array('SalidaDetalle.id'=>$detalle['id'])));
								$_detalle = $_detalle['SalidaDetalle'];
								if(!$this->Kardex->borrarMovimiento(array(
										'almacen_id'=>$original['Salida']['centro_dist_id'],
										'ejercicio_id'=>$original['Salida']['ejercicio_id'],
										'periodo_id'=>$original['Salida']['periodo_id'],
										'codigo_documento_id'=>$original['Salida']['codigo_documento_ref_id'],
										'documento_id'=>$this->data['Salida']['id'],
										'detalle_id'=>$_detalle['id'],
										'cantidad'=>$_detalle['cantidad'],
										'producto_id'=>$_detalle['producto_id'],
										'operacion_id'=>$original['Salida']['tipo_movimiento_id'],
	        							'operacion_almacen_id'=>1))){
									$this->Session->setFlash('No se pudo restablecer el movimiento del producto '.$detalle['producto_descripcion']);
		            				$result = false;
									break;	
								}
							}
						}
						$detalle['salida_id'] = $this->data['Salida']['id'];
						if(!$this->Salida->SalidaDetalle->save($detalle)){
							$result = false;
							break;
						} else if($this->data['Salida']['descarga']){
							if(!$this->Kardex->generarMovimiento(array(
		            				'almacen_id'		=>	$this->centroDistId(),
		            				'ejercicio_id'		=>	$this->ejercicioId($this->data['Salida']['fecha_emision']),
		            				'periodo_id'		=>	$this->periodoId($this->data['Salida']['fecha_emision']),
		            				'fecha'				=>	$this->data['Salida']['fecha_emision'],
		            				'producto_id'		=>	$detalle['producto_id'],
		            				'codigo_documento_id'=>	$this->data['Salida']['codigo_documento_ref_id'],
		            				'documento_id'		=>	$detalle['salida_id'],	
		            				'cantidad'			=>	$detalle['cantidad'],
		            				'operacion_id'		=>	$this->data['Salida']['tipo_movimiento_id'],
		            				'operacion_almacen_id'=>2,            			
		            				'detalle_id'		=>	$this->Salida->SalidaDetalle->id,
									'fecha_emision'		=>	$this->data['Salida']['fecha_emision'],
									'numero_documento'	=>	$this->data['Salida']['numero_control'],
									'observaciones'		=>	$this->data['Salida']['observaciones']))){
	            			
	            				$this->Session->setFlash('No se pudo mover los saldos sdel producto '.$detalle['producto_descripcion']);
	            				$result = false;
								break;
							}
						}
					} else {
						if(!empty($detalle['id'])){
							if(!$this->Salida->SalidaDetalle->delete($detalle['id'])){
								$result = false;
								break;
							}
						} else if($original['Salida']['descarga']){
							$_detalle = $this->Salida->SalidaDetalle->find('first', array(
													'recursive'=>-1, 
													'conditions'=>array('SalidaDetalle.id'=>$detalle['id'])));
							$_detalle = $_detalle['SalidaDetalle'];
							if(!$this->Kardex->borrarMovimiento(array(
										'almacen_id'=>$original['Salida']['centro_dist_id'],
										'ejercicio_id'=>$original['Salida']['ejercicio_id'],
										'periodo_id'=>$original['Salida']['periodo_id'],
										'codigo_documento_id'=>$original['Salida']['codigo_documento_ref_id'],
										'documento_id'=>$this->data['Salida']['id'],
										'detalle_id'=>$_detalle['id'],
										'cantidad'=>$_detalle['cantidad'],
										'producto_id'=>$_detalle['producto_id'],
										'operacion_id'=>$original['Salida']['tipo_movimiento_id'],
	        							'operacion_almacen_id'=>1))){
									$this->Session->setFlash('No se pudo eliminar el movimiento del producto '.$detalle['producto_descripcion']);
	            				$result = false;
								break;	
							}
						}						
					}					
				}				
			} else {
				$result = false;	
			}
			if($result){
				$this->Salida->commit();	
				$this->Session->setFlash($this->mensaje['Information']);
				$this->redirect(array('action'=>'index'));
			} else {
				$this->Salida->rollback();
				$this->Session->setFlash($this->mensaje['Error_edit']);					
			}	
		}
	
    }    
	
    function delete($id, $bahivor = false){
        if (empty($id)) {
            $this->Session->setFlash(__('Salida Invalido', true));
            $this->redirect(array('action'=>'index'));
            return false;
		}
        $Salida = $this->Salida->find('first', array(
        							'conditions'=>array('Salida.id'=>$id),
        							'contain'=>array('SalidaDetalle')));
        $Salida['Salida']['usuario_borrado_id'] = $this->usuarioId();
        $Salida['Salida']['fecha_borrado']='now()';
        $Salida['Salida']['activo'] = false;

        if($this->Salida->save($Salida)){
        	if($Salida['Salida']['descarga']){
	        	foreach($Salida['SalidaDetalle'] as $detalle){
	        		if(!$this->Kardex->borrarMovimiento(array(
							'almacen_id'=>$Salida['Salida']['centro_dist_id'],
							'ejercicio_id'=>$Salida['Salida']['ejercicio_id'],
							'periodo_id'=>$Salida['Salida']['periodo_id'],
							'codigo_documento_id'=>$Salida['Salida']['codigo_documento_ref_id'],
							'documento_id'=>$Salida['Salida']['id'],
							'detalle_id'=>$detalle['id'],
							'cantidad'=>$detalle['cantidad'],
							'producto_id'=>$detalle['producto_id'],
							'operacion_id'=>$Salida['Salida']['tipo_movimiento_id'],
	        				'operacion_almacen_id'=>1))){					
						if($bahivor){
			        		return false;
			        	} else {
			        		$this->Session->setFlash(__('Se ha producido un error al eliminar el Ingreso.',true));
			            	$this->redirect(array('action'=>'index'));	
			        	}	
					}
	        	}
        	}
        	if($bahivor){
        		return true;
        	} else {
        		$this->Session->setFlash(__('Se ha eliminado con exito.',true));
            	$this->redirect(array('action'=>'index'));	
        	}
        }else {
        	if($bahivor){
        		return false;
        	} else {
        		$this->Session->setFlash(__('Se ha producido un error al eliminar el Salida.',true));
            	$this->redirect(array('action'=>'index'));
        	}            
       }
    }

   
    function process(){    	
		$this->Salida->begin();
		foreach($this->data as $dato){
			if($dato['id']!='0'){				
				if(isset($this->params['form']['delete'])){
					if(!$this->delete($dato['Salida']['id'], true)){
						$this->redirect(array('action'=>'index'),null,true);
						$this->Salida->rollback();
						return false;
					}
				}				
			}
	
		}
		$this->Salida->commit();
		$this->Session->setFlash('Registros fueron eliminados correctamente.');
		$this->redirect(array('action'=>'index'),null,true);			    	
    }
    
    public function ajax(){
     if ($this->RequestHandler->isAjax() && !empty($this->params['form'])) {            
			 Configure::write('debug', 0);
			 $this->autoRender = false;
             $this->autoLayout = false;						
			if(!isset($this->params['form']['action'])){
				$this->params['form']['action'] = 0;
			}
			
			switch ($this->params['form']['action']){					
				case 1: //generar nuevo codigo
					$grupo = $this->params['form']['grupo'];					
					$data = $this->Salida->getCodigo($grupo);				
					$result = $data;
					break;							
				
			}
			if ($result){
				ob_end_clean();
				$this->header('Content-Type: application/json');
				echo json_encode($result);
			}
			else
				echo '';
		}	
    	
    }
}
?>